package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.entity.SetmealDto;
import com.itheima.reggie.mapper.CategoryMapper;
import com.itheima.reggie.mapper.SetmealMapper;
import com.itheima.reggie.service.CategoryService;
import com.itheima.reggie.service.SetmealDishService;
import com.itheima.reggie.service.SetmealService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;

/**
 * @author ：石破天
 * @date ：Created in 2022年12月20日
 * @description ：
 * @version: 1.0
 */
@Service
@Slf4j
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal> implements SetmealService {

    @Autowired
    private SetmealDishService setmealDishService;

    /**
     *   setmealDto 接收前端 传递来的套餐基本数据+套餐菜品关联数据
     *      保存到  setmeal表中 保存 setmeal_dish表中
     * @param setmealDto
     */
    @Override
    @Transactional
    public void saveWithDish(SetmealDto setmealDto) {
        // 1:套餐基本信息存到 setmeal表中
        this.save(setmealDto);
        // 添加完id回显到 setmealDto
        // 获取添加后的套餐id
        Long setmealId = setmealDto.getId();
        // 2：把关联关系 (套餐和菜品) 存到 setmeal_dish表
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
        // 遍历每个 对应关系 把 新添加的套餐id放进去
        for (SetmealDish setmealDish : setmealDishes) {
            setmealDish.setSetmealId(setmealId);
        }
        //批量添加
        setmealDishService.saveBatch(setmealDishes);

    }

    /**
     *  删除已停售的套餐及相关的 菜品关联数据
     * @param ids
     */
    @Override
    @Transactional
    public void removeByIdsWithDish(List<Long> ids) {  //[4个id]
        //1: 这些ids 查询出来的 是不是都是 停售的
        // 这些id对应的 状态是不是有启售的  如果有一个启售的就不能删除
        // 初级程序员:
        //     遍历id 查询每一个套餐数据  套餐数据状态 检查 是不是1 是就不能删除 如果没有1 能删除
        // 中级程序员:
        //     4个id,查询 符合启售状态的套餐数量，如果数量>0 包含启售 不能删除。
        // select count(*) from setmeal where id in (1,2,3,4) and status=1;
        LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(Setmeal::getId,ids);
        wrapper.eq(Setmeal::getStatus,1);
        //查个数
        // 根据 Wrapper 条件，查询总记录数
//        int count(Wrapper<T> queryWrapper)
        int count = this.count(wrapper);
        if(count>0){//有启售
            throw  new CustomException("套餐正在售卖中...请勿删除");
        }
        // 如果能执行到这里 没有抛异常，全部是停售  能删除

        // 删除 套餐
        this.removeByIds(ids);
        // 删除  套餐和菜品关联关系
        //  delete from setmeal_dish where setmel_id in (1,2,3)
        LambdaQueryWrapper<SetmealDish> wrapper1 = new LambdaQueryWrapper<>();
        wrapper1.in(SetmealDish::getSetmealId,ids);

        setmealDishService.remove(wrapper1);

        // 在我们这里都可以 ，我们数据库没有涉及约束。
        // 如果 两个表有关联关系，主外键关系。  先删除从表 再删除主表。
    }
}
